package Behaviour;

import java.util.List;

import Model.Car;
import View.PanelGui;
import map.Entry;
import map.Map;
import jade.core.Agent;
import jade.core.behaviours.OneShotBehaviour;

public class UpdatePerformanceMeasure extends OneShotBehaviour {

	private static final long serialVersionUID = 3116592781791953101L;
	private Map map;
	private PanelGui panel;
	
	public UpdatePerformanceMeasure(Agent myAgent, Map map, PanelGui panelGui) {
		this.map = map;
		this.panel = panelGui;
		//OBIETTIVO: LA MISURA DI PRESTAZIONE AUMENTA ALL'AUMENTARE DEL TRAFFICO CORRETTAMENTE GESTITO.
		//SE IL SISTEMA LAVORA POCO, PRENDE POCHI PUNTI.
	}

	@Override
	public void action() {
		
		int total = map.getCars().size();
		
		//RAPPORTO TRA CAPACITA' MASSIMA E NUMERO DI AUTO PRESENTI. 
		double A = 0.0;
		if(total > 0)
			A = map.getCapacity()/total;
		
		//RAPPORTO TRA NUMERO DI AUTO PRESENTI E IL NUMERO DI AUTO CHE ENTRANO.
		double B = 0.0;
		Integer carnum = (Integer) panel.carcombo.getSelectedItem();
		if(carnum > 0 && total > 0)
			B = total/carnum;
		 
		//RAPPORTO TRA NUMERO DI AUTOMOBILI CHE ESCONO DALL'AREA E IL NUMERO DI AUTO PRESENTI.
		double C = 0.0;
		List<Car> listCars = map.getCars();
		for (Car car : listCars) {
			if(car.checkFinish())
				C++;
		} 
		if(C > 0 && carnum > 0)
			C = C/carnum;
		
		//RAPPORTO TRA MACCHINE TOTALI PRESENTI E 
		//NUMERO TOTALE DI AUTOMOBILI IN ATTESA DI ENTRARE.
		double D = 0.0;
		List<Entry> entries = map.getEntries();
		int carswaiting = 0;
		for (Entry entry : entries) {
			carswaiting += map.getWaitListSize(entry.getCoordEntry());
		}
		if(carswaiting > 0 && total > 0)
			D = total/carswaiting;
		
		//IL VALORE E' COMPRESO TRA 0 E 1 E RAPPRESENTA QUANTO BENE SI STA COMPORTANDO
		//IL SISTEMA RISPETTO AL NUMERO DI AUTOMOBILI. PIU' AUTO CI SONO, PIU' CARICO
		//DI LAVORO C'E' E PIU' ALTO SARA' IL VALORE DELLA FUNZIONE. 
		//IL VALORE DI PARTENZA E' 100 A CUI VENGONO DETRATTI:
		//- RAPPORTO TRA CAPACITA' MASSIMA E NUMERO DI AUTO PRESENTI
		//- RAPPORTO TRA NUMERO DI AUTO PRESENTI E IL NUMERO DI AUTO CHE ENTRANO
		//- RAPPORTO TRA TOTALE E AUTO IN ATTESA 
		//E VIENE AGGIUNTO, COME BONUS, IL NUMERO DI AUTO CHE IL SISTEMA PORTA A DESTINAZIONE PER 
		//UNITA' DI TEMPO.
		double performanceMeasure = (100-(A - C + B + D))*1/100;
		panel.performanceLabel.setText("Performance Measure: " + performanceMeasure);
	}

}
